/**
 * 函数
 */

function func () {
    console.log('我是func函数: ' + this.name);
}
// call与apply都为 ·函数对象· 的方法，需要通过函数对象来调用
// 当对函数调用call()与apply()时都会调用函数执行
// 所以其实func()、call()与apply()的效果等同

// 0. func(): 返回[object window]
func(); // 我是func函数: undefined

// 1. call: 返回[object object]
func.call(); // 我是func函数: undefined

// 2. apply: 返回[object object]
func.apply(); // 我是func函数: undefined

// 3. 总结
//  a. 如果以函数的形式调用, this指向永远都是window
//  b. 而以方法形式调用时, this指向调用方法的那个对象 -> 又因为对象的原型为Object -> 所以指向object

// 因为call()与apply()返回的是[object object], 所以在调用时可以将一个对象指定为第一个参数
// 此时这个对象将会成为函数执行时的this
var obj = { name: '孙悟空' };
var def = { name: '白晶晶' };
func.call(obj); // 我是func函数: 孙悟空
func.apply(def); // 我是func函数: 白晶晶

// 4. call()与apply()的区别
// call()方法可以将实参在对象之后依次传递
// apply()方法需要将实参封装到一个数组依次传递
